#include "linkstack.h"

// 初始化
stack * init_stack(void)
{
    // 申请管理结构体
    stack *s = malloc(sizeof(stack));
    if(s != NULL)
    {
        s->top = malloc(sizeof(listnode));
        if(s->top == NULL)
        {
            free(s);
            return NULL;
        }

        INIT_LIST_HEAD(&s->top->list);
    }
    s->size = 0;
    return s;
}

linklist new_node(int data)
{
    linklist new = malloc(sizeof(listnode));
    if(new != NULL)
    {
        new->data = data;
        INIT_LIST_HEAD(&new->list);
    }
    return new;
}

// 入栈
bool push(stack *s, linklist new)
{
    // 所有的内核链表的操作接口的参数，一律都是小结构体指针
    list_add(&new->list, &s->top->list);

    s->top = new;
    s->size++;
    return true;
}

bool is_empty(stack *s)
{
    return s->size == 0;
}

// 出栈
bool pop(stack *s, int *pdata)
{
    if(is_empty(s))
        return false;

    linklist tmp = list_entry(s->top->list.prev, listnode, list);

    // 将元栈顶元素从链式栈中剔除
    list_del(&s->top->list);
    *pdata = s->top->data;
    free(s->top);

    // 更新栈顶指针
    s->top = tmp;
    s->size--;
    return true;
}